/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package objetos;

import DataTypes.DataMensaje;
import Interfaces.Factory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;


public class Chat {
    
    private HashMap<String,Usuario> participantes;
    private int id;
    private DataMensaje buffer=null;
    private ArrayList<Mensaje> historial;
    boolean disponible = false;
    HashMap<String, String> lectores;
    private boolean finalizo = false;

    
    public Chat (String us1,String us2){
    
    participantes = new HashMap<String, Usuario>();
    
    Usuario usu1 = Factory.getInstance().getUsuarios().getUSuarioU(us1);
    Usuario usu2 = Factory.getInstance().getUsuarios().getUSuarioU(us2);
    participantes.put(us1,usu1);
    participantes.put(us2,usu2);
    
    historial = new ArrayList<Mensaje>();
    lectores = new HashMap<String, String>();
    }

    public HashMap<String, Usuario> getParticipantes() {
        return participantes;
    }

    public void setParticipantes(HashMap<String, Usuario> participantes) {
        this.participantes = participantes;
    }
    
    
     public synchronized void mandarMsj(DataMensaje dm){
    
         while (disponible) {
             try {
                 wait();
             } catch (InterruptedException ex) {
             }
         }
         buffer = dm;
         disponible = true;
         notifyAll();
         Mensaje m = new Mensaje(dm);
         historial.add(m);
        
 } 
  
   public synchronized DataMensaje getMsj(String usuario){
       
       
       while (!disponible) {
           try {
               lectores.put(usuario,null);
               wait();
           } catch (InterruptedException ex) {
           }
       }
       lectores.remove(usuario);
       
       if(lectores.isEmpty())
       disponible = false;
       
       DataMensaje result = new DataMensaje();
       result.setEmisor(buffer.getEmisor());
       result.setFecha(buffer.getFecha());
       result.setMsj(buffer.getMsj());
//       lectores.remove(usuario);
//       if(lectores.isEmpty())
//           buffer="";
       notifyAll();

       return result;


   }
   
   public ArrayList<Mensaje> getHistorial(){
       
       return historial;
   }
   
   public boolean tieneParticipantes(String us1,String us2){
        Iterator<Usuario> it= participantes.values().iterator();
        Iterator<Usuario>it2 = participantes.values().iterator();
        boolean esta1 = false;
        boolean esta2 = false;
        
        while(it.hasNext() && !esta1){
            
            Usuario usu = it.next();
            if(usu.getCorreo().equals(us1))
                esta1= true;
            
        }
          while(it2.hasNext() && !esta2){
            
            Usuario usu = it2.next();
            if(usu.getCorreo().equals(us2))
                esta2 = true;
            
        }
        
        
        return esta1 && esta2;
   }
   
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }



    public void AgregarAlChat(Usuario usu){
        
        participantes.put(usu.getCorreo(),usu);
        
    }
    public void AbandonarChat(Usuario usu){
        
        participantes.remove(usu.getCorreo());
       
      
    }
 
    /**
     * @param historial the historial to set
     */
    public void setHistorial(ArrayList<Mensaje> historial) {
        this.historial = historial;
    }

    public boolean isFinalizo() {
        return finalizo;
    }

    public void setFinalizo(boolean finalizo) {
        this.finalizo = finalizo;
    }
     
  }
